/*
* INSANE - Interactive Structural Analysis Environment
*
* Copyright (C) 2003-2005
* Universidade Federal de Minas Gerais
* Escola de Engenharia
* Departamento de Engenharia de Estruturas
* 
* Author's email :    insane@dees.ufmg.br
* Author's website :  http://www.dees.ufmg.br/insane
* 
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/
package br.ufmg.dees.insane.shape;

import br.ufmg.dees.insane.util.IMatrix;


/**
*A class representing a shape function for the RMCIQ4 element.
*
*@author Samir
*@version 1.0
*@since 06/11/06
*/

public class RMCIQ8 extends Q8 {
	private static final long serialVersionUID = 1L;

    /* (non-Javadoc)
     * @see br.ufmg.dees.insane.shape.Shape2D#getType()
     */
    public String getType() {
        return "RMCIQ8";
    }
    
    public IMatrix getAPT(double[] g, IMatrix cN){
		IMatrix APT = new IMatrix(2,20);
		APT.setZero();
		
    	double a = Math.sqrt(3);
    	double e = g[0];
    	double n = g[1];
    	
    	double n00 = 0.25*(n+a*e)*(1+n);
    	double n10 = 0.25*(n-a*e)*(1+n);
    	double n20 = (1-n*n);
    	double n30 = 0.25*(-n+a*e)*(1-n);
    	double n40 = 0.25*(-n-a*e)*(1-n);
    	
    	double n01 = 0.25*(e+a*n)*(1+e);
    	double n11 = 0.25*(e-a*n)*(1+e);
    	double n21 = (1-e*e);
    	double n31 = 0.25*(-e+a*n)*(1-e);
    	double n41 = 0.25*(-e-a*n)*(1-e);
    	
    	APT.setElement(0,0,n00);
    	APT.setElement(0,2,n10);
    	APT.setElement(0,4,n20);
    	APT.setElement(0,6,n30);
    	APT.setElement(0,8,n40);
    	APT.setElement(1,11,n01);
    	APT.setElement(1,13,n11);
    	APT.setElement(1,15,n21);
    	APT.setElement(1,17,n31);
    	APT.setElement(1,19,n41);

		
		return APT;
    }

    public IMatrix samplingPoints(){
    	IMatrix sp = new IMatrix(10,2);
    	sp.setZero();
    	
    	double a = 1.0/Math.sqrt(3);
    	
    	sp.setElement(0,0,a);
    	sp.setElement(0,1,1);
    	sp.setElement(1,0,-a);
    	sp.setElement(1,1,1);
    	sp.setElement(3,0,a);
    	sp.setElement(3,1,-1);
    	sp.setElement(4,0,-a);
    	sp.setElement(4,1,-1);
    	
    	sp.setElement(5,0,1);
    	sp.setElement(5,1,a);
    	sp.setElement(6,0,1);
    	sp.setElement(6,1,-a);
    	sp.setElement(8,0,-1);
    	sp.setElement(8,1,a);
    	sp.setElement(9,0,-1);
    	sp.setElement(9,1,-a);
    	
    	return sp;
    }
}
